import socket, threading, time


def service():
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    # 我们要绑定监听的地址和端口。服务器可能有多块网卡，可以绑定到某一块网卡的IP地址上，
    # 也可以用0.0.0.0绑定到所有的网络地址，还可以用127.0.0.1绑定到本机地址。127.0.0.1是一个特殊的IP地址，表示本机地址，
    # 如果绑定到这个地址，客户端必须同时在本机运行才能连接，也就是说，外部的计算机无法连接进来。
    # 绑定并监听端口
    s.bind(('127.0.0.1', 9999))
    s.listen(5)
    print('waiting for connection...')

    # 一个永久循环来接受来自客户端的连接，accept()会等待并返回一个客户端的连接:
    def tcplink(sock, addr):
        print('accept new connection from %s:%s...' % addr)
        sock.send(b'welcome')
        while True:
            data = sock.recv(1024)
            time.sleep(1)
            if not data or data.decode('utf-8') == 'exit':
                break
            sock.send(('hello,%s!' % data.decode('utf-8')).encode('utf-8'))
        sock.close()
        print('connection from %s:%s closed.' % addr)

    while True:
        sock, addr = s.accept()
        t = threading.Thread(target=tcplink, args=(sock, addr))
        t.start()


if __name__ == '__main__':
    service()
